Перейти к основному содержанию

Установка 1С:Предприятия 8.3 в Linux контейнере или 1С в Docker, LXC, Systemd-nspawn

··9 мин.

1. Чуть-чуть о Linux и контейнерах #

Linux-контейнер – это набор процессов, изолированный от остальной операционной системы и запускаемый с отдельного образа, который содержит все файлы, необходимые для их работы. Образ содержит все зависимости приложения и поэтому может легко переноситься из среды разработки в среду тестирования, а затем в промышленную среду.

Контейнеры используют одно и то же ядро операционной системы и изолируют процессы приложения от остальной системы.

Для примера возьмем мою задачу. Я уже много лет использую Linux и хочу установить платформу 1С в Linux, но мой дистрибутив официально не поддерживается (Arch Linux). К тому же не горю желанием ставить платформу на свою основную систему.

Можно было бы использовать виртуальную машину, но неудобно использовать и больший чем у контейнера расход системных ресурсов.

Образ диска на диске, в котором пустое место тоже занимает место. Контейнер это просто каталог на диске, лишнего не занимает и бесшовно интегрируется в основную систему.

1.1 Docker #

Для моего кейса не очень, поскольку один контейнер один сервис т.е. необходимо два контейнера, один на СУБД, второй на сервер 1С. Как пробросить приложение с GUI тоже вопрос (хотя это и возможно), обычно там крутят сервисы без GUI. Поэтому не в этот раз.

1.2 LXC #

Подсистема контейнеризации, позволяющая запускать нескольких изолированных экземпляров операционной системы Linux на одном узле. LXC не использует виртуальные машины, а создает виртуальное окружение с собственным пространством процессов и сетевым стеком. Все экземпляры LXC используют один экземпляр ядра операционной системы.

Интересная штука от Canonical, подходит для моих целеей, но её нужно ставить, а у нас уже есть встроенный вариант.

1.3 Systemd-Nspawn #

Платформа контейнеризации на основе systemd. Ее очевидный плюс заключается в нативности. Название systemd-nspawn представляет собой сокращение от namespaces spawn. Уже из этого названия следует, что systemd-nspawn управляет только изоляцией процессов, но при этом не может изолировать ресурсы (однако это можно сделать средствами самого systemd).

С помощью systemd-nspawn можно создать полностью изолированное окружение, в котором автоматически будут смонтированы псевдофайловые системы /proc и /sys, а также созданы изолированный loopback-интерфейс и отдельное пространство имен для идентификаторов процессов (PID), внутри которого можно запускать ОС, основанную на ядре Linux.

Я покажу не совсем безопасный способ, для более безопасного способа используйте непривилегированный контейнер, и отдельного пользователя для СУБД.

Я создаю окружение для разработчика и не буду этим париться.

Что получилось можете увить на видео сначала ролика.

2. Приступаем к практике, подготовим базовую систему #

Статья обновлена 05.11.2025 Статья часто просматривается, вероятно полезна людям, разворачивая очередной контейнер решил её актуализировать.

Хост у меня Arch Linux, в контейнере Linux Ubuntu 22.04 LTS. Хотел обновить на Linux Ubuntu 24.04 LTS, но 1С ещё к этому не готова (! конец 25 года на дворе) требует старую библиотеку libwebkit2gtk-4.0-37. И тут либо ставить из 22.04, либо пробовать делать симлинки. Для контейнера новый 24.04 релиз не так важен, оставил 22.04.

Обновил PostgreSQL до 17 версии. Сделал новый раздел как использовать usb ключи (hasp) хоста в контейнере.

Видео не актуализировал, нет свободного времени. Но думаю и так понятно.

Для установки подготовим базовую систему на базе Linux Ubuntu 22.04 LTS.

У systemd-nspawn есть утилита для управления контейнерами machinectl, она предполагает расположение контейнеров по пути /var/lib/machines. Этой утилитой мы пользоваться не будем, но на будущее учтем и расположим контейнер по данному пути.

Для создания корневой системы нам понадобится набор скриптов debootstrap, установим их с помощь вашего пакетного менеджера.

Мой контейнер будет называться two, создадим базовую систему:

sudo debootstrap --include=dbus-broker,systemd-container --components=main,restricted,universe,multiverse jammy /var/lib/machines/two http://archive.ubuntu.com/ubuntu

Получаю ошибку:

Unknown architecture: x86_64

x86_64_v2

Оказалось в Arch Linux у debootstrap убрали зависимость dpkg. Он вроде бы и не нужен, но есть ньансы, не будем тратить на это время больше, чем оно того заслуживает и установим dpkg. Потом, если захотим, удалим.

Но не тут то было и установка обрывается на:

Tried to extract package, but tar failed. Exit..

Ничего страшного будем использовать вместо tar ar:

sudo debootstrap --extractor=ar --include=dbus-broker,systemd-container --components=main,restricted,universe,multiverse jammy /var/lib/machines/two http://archive.ubuntu.com/ubuntu

Вот теперь всё ОК.

Запустим контейнер без init, установим пароль root:

sudo systemd-nspawn -D /var/lib/machines/two

passwd - вводим пароль

Настроим DNS, чтобы в контейнере заработала сеть:

echo DNS=8.8.8.8 >> /etc/systemd/resolved.conf

Выходим:

logout

Запустим контейнер:

sudo systemd-nspawn -b -D /var/lib/machines/two

3. Установим PostgreSQL #

Нам понадобится специальная сборка под 1С, я буду использовать сборку от команды PostgrePro.

Установим несколько программ, они нам понадобятся в дальнейшем.

apt install wget mc

Теперь скачаем скрипт для добавления репозитория PostgrePro:

wget https://repo.postgrespro.ru/1c-17/keys/pgpro-repo-add.sh

И выполним его:

sh pgpro-repo-add.sh

Настроем локали:


locale-gen en_US.UTF-8 ru_RU.UTF-8 
update-locale LANG=ru_RU.UTF-8

Сразу установим переменную окружения:


echo export DISPLAY=:0 >> .bashrc

Перезагрузим контейнер:

reboot

Установим СУБД:

apt install postgrespro-1c-17

Запустим psql от пользователя postgres:

sudo -u postgres psql

Установим пароль:

 ALTER ROLE postgres WITH PASSWORD '909090';

 exit;

4. Установим платформу 1С:Предприятие 8.3 #

Скачайте платформу и скопируйте ее в контейнер в каталог root. Я скопировал, мой файлик называется setup-full-8.3.27.1859-x86_64.run.

Устанавливать будем в пакетном режиме, если будете ставить на сервер без Х11, то пригодится знать этот режим.

./setup-full-8.3.27.1859-x86_64.run --mode unattended --enable-components server,client_full,ws,server_admin,liberica_jre,ru

Устанавливаем сервис

systemctl link /opt/1cv8/x86_64/8.3.27.1859/srv1cv8-8.3.27.1859\@.service

Добавляем в автозагрузку

systemctl enable srv1cv8-8.3.27.1859@.service.

Запускаем

systemctl start srv1cv8-8.3.27.1859@.service.

Остановим контейнер

shutdown now

Разрешим подключаться к X11 от локолхоста. Для этого выполним на хосте:

xhost +local:

Запустим его с требуемыми разрешениями для проброса X11

sudo systemd-nspawn -b -D /var/lib/machines/two --bind=/dev/dri/ --property=DeviceAllow='char-drm rw'

Логинемся и запускаем 1С

/opt/1cv8/common/1cestart

И между мной и 1С состоялся диалог:

error while loading shared libraries: libcups.so.2:

apt install libcups2

error while loading shared libraries: libgtk-3.so.0:

apt install libgtk-3-0

error while loading shared libraries: libXxf86vm.so.1:

apt install libxxf86vm1

error while loading shared libraries: libSM.so.6:

apt install libsm6

error while loading shared libraries: libwebkit2gtk-4.0.so.37:

apt install libwebkit2gtk-4.0-37

error while loading shared libraries: libGLU.so.1:

apt install libglu1-mesa

Вы можете поставить зависимости всё и сразу:

apt install libcups2 libgtk-3-0 libxxf86vm1 libsm6 libwebkit2gtk-4.0-37 libglu1-mesa

Можно ещё от MS шрифты поставить, чтобы было как в Windows:

apt install ttf-mscorefonts-installer

Соглашаемся с лицензиями. Обновляем кэш шрифтов:

fc-cache -vr

Добавляем базу и проверяем.

/opt/1cv8/common/1cestart

5. USB ключи и HASP #

В видео я активировал комьюнити лицензию и там все просто. Были вопросы про HASP. Давайте рассмотрим его настройку.

В ПК и меня вставлены два ключа, выполним на хосте:

sudo lsusb

Вот они:

Bus 005 Device 002: ID 0529:0001 Aladdin Knowledge Systems HASP copy protection dongle

Bus 005 Device 003: ID 0529:0001 Aladdin Knowledge Systems HASP copy protection dongle

Найдите свои ключи, номера нам понадобятся в дальнейшем.

Выполним установку HASP. Скачаем пакеты:

wget https://interface31.ru/pub/Etersoft/HASP/Debian/haspd_7.90-eter2debian_amd64.deb https://interface31.ru/pub/Etersoft/HASP/Debian/haspd-modules_7.90-eter2debian_amd64.deb

Установим:

dpkg -i haspd*.deb

И разрешим зависимости:

apt-get -f install

Добавим в автостарт, запустим:

systemctl enable haspd
systemctl start haspd
systemctl status haspd

И видим:

failed to create symbolic link ‘/proc/bus/usb/devices’: No such file or directory

haspd[4978]: Running aksusbd…

haspd[5010]: /etc/init.d/haspd: 221: aksusbd: not found

Я точно знаю, что нам не хватает еще одного пакета, установим:

apt install libc6-i386

Пробуем:

systemctl start haspd
systemctl status haspd

Запустился.

Пробуем запустить 1С-ку. Она ключи не видит…

На самом деле, доступ к ним требуется разрешить, гасим систему:

shutdown now

И запускаем так:

sudo systemd-nspawn -b -D /var/lib/machines/two --bind=/dev/dri/ --bind=/dev/bus/usb/ --property=DeviceAllow='char-drm rw' --property=DeviceAllow='char-usb_device rwm'

Проверяем:

systemctl status haspd

Видим сообщения:

aksusbd[104]: merge_tables: cannot open /proc/bus/usb/005/002: No such file or directory

aksusbd[104]: merge_tables: cannot open /proc/bus/usb/005/003: No such file or directory

Гугление дало следующий результат: “usbfs выкинута на мороз еще с 3.10.х” (с).

Непонятно, потому как не контейнере всё нормально запускается. Давайте попробуем сделать симлинк:

ln -s /dev/bus/usb/005 /proc/bus/usb/
systemctl restart haspd
systemctl status haspd

Похоже всё хорошо. Попробуем запустить 1С.

Ура! Запустилась!

После перезагрузки симлинк исчезнет и всё нужно будет делать опять. Сделаем юнит создающий симлинк:

mcedit /etc/systemd/system/keysusb.service

Вставляем содержимое:

[Unit]
Description=KeysUSB
After=network.target

[Service]
Type=oneshot
User=root
Group=root

ExecStart=/usr/bin/ln -s /dev/bus/usb/005 /proc/bus/usb/


[Install]
WantedBy=multi-user.target

В ExecStart напишите свой номер usb.

Добавим в автозагрузку:

systemctl enable keysusb.service

И ребут:

reboot

Проверяем:

/opt/1cv8/common/1cestart

Всё работает!

6. Наводим красоту #

Давайте сделаем пункт меню, который облегчит запуск контейнера. Работаем в хостовой системе, создадим файл 1c.sh со следующим содержимым

#!/bin/bash

xhost +local:

sudo systemd-nspawn -b -D /var/lib/machines/two --bind=/dev/dri/ --bind=/dev/bus/usb/ --property=DeviceAllow='char-drm rw' --property=DeviceAllow='char-usb_device rwm'

Расположим его где-то, у меня есть каталог Soft например. Сделаем файл выполняемым и добавим его в меню. Теперь достаточно выбрать этот пункт в меню для запуска контейнера.

Подробнее в видео.

7. Видео #

Это видео также можно посмотреть на ДЗЕН.Видео

8. Настройка PostgresSQL для 1С #

Эксперименты провожу на своем весьма пожилом рабочем ноутбуке. Работаю на нем уже десять лет, мой талисман.

Процессор AMD A10-4600M, 8 гигов памяти, база лежит на ноутбучном диске 5400 на оборотов в минуту. Поэтому тут не будет каких-то изощренных тестов, планов запроса и т.п., но тем не менее мы значительно ускорим работу СУБД.

В пустую базу добавим справочник назовем Номенклатура, добавим обработку, форму, кнопку и простой код:

&НаСервере
Процедура БенчСправочникНаСервере()
    й = 10000;
    Пока й <> 0 Цикл
        й = й - 1; 
        об = Справочники.Номенклатура.СоздатьЭлемент();
        об.Наименование = "Бенч " + Строка(й);
        об.Записать();
    КонецЦикла;
КонецПроцедуры

&НаКлиенте
Процедура БенчСправочник(Команда)   
    ДатаНачала = ТекущаяДата();
    БенчСправочникНаСервере();
    ДатаОкончания = ТекущаяДата();
    Сообщить(ДатаОкончания - ДатаНачала);
КонецПроцедуры

Нас будет интересовать конфиг с которым PostgreSQL сейчас работает, лежит он тут /var/lib/pgpro/1c-15/data/postgresql.conf.

Сначала проведем замеры до, жамкаем кнопку и ждем, у меня вышло 865 секунд. Теперь изменим ряд настроек:

max_connections = 20
ssl = off
shared_buffers = 1GB
work_mem = 64MB
maintenance_work_mem = 256MB
synchronous_commit = off
wal_buffers = 16MB
checkpoint_completion_target = 0.9
max_wal_size = 4GB
min_wal_size = 2MB
effective_cache_size = 3GB
default_statistics_target = 100
autovacuum = on
row_security = off

Перезапускаем сервер и снова жамкаем кнопку, результат 115 секунд.

На этом же ноутбуке на Windows и MSSQL с базой на SSD 85 секунд. Здесь же база на HHD еще + файловая система COW BTRFS, что тоже не добавляет производительности. На проде не стоит использовать BTRFS под базы данных, но на ноуте мне важнее контрольные суммы файлов, сжатие и виртуальные тома. А так было бы интересно проверить это на SSD и XFS.

Более подробно по рекомендуеммы параметрам PostgreSQL для 1С можно узнать по ссылке внизу статьи. Образцы конфигов /opt/pgpro/1c-15/share/ для различных систем, можете подсмотреть в них что-то полезное.

Интересно что не всё под Linux работает медленнее, что-то сильно быстрее. У меня сейчас в работе универсальный обмен по http (будет цикл статей на эту тему) так вот, создание HTTPСоединение на Linux в 2 раза быстрее чем Windows, создание HTTPСоединение и отправка запроса в 5 раз быстрее в Linux. Пока не понимаю почему такая разница, но факт, есть факт.

9. Сообщения, ошибки и прочее #

Переодически в консоли появляется:

Couldn’t connect to accessibility bus: Failed to connect to socket /run/user/1000/at-spi/bus_0: No such file or directory

Причина в подключение к сервисам accessibility (помощь для инвалидов). Оключим это:

echo export NO_AT_BRIDGE=1 >> .bashrc

10. Ссылки на документацию #

  1. ИТС пакетная установка платформы
  2. ИТС настройка сервиса 1С
  3. ман к systemd-nspawd
  4. Arch-Wiki systemd-nspawd
  5. ИТС настройка PostgreSQL